package com.cn.wanxi.task;

import com.cn.wanxi.entity.MailEntity;
import com.cn.wanxi.redis.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Component
public class OperateTask {
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Autowired
    private RedisUtils redisUtils;

    /**
     * 单任务定时器
     */
    @Scheduled(fixedRate = 30000)
    public void reportCurrentTime() {
//        System.out.println("NOW：" + sdf.format(new Date()));
        List<Object> mailEntityList = redisUtils.lRange("mailEntityList", 0, -1);
        for (int i = 0; i < mailEntityList.size(); i++) {
            MailEntity mailEntity = (MailEntity) mailEntityList.get(i);
            System.out.println(mailEntity.toString());
        }
    }

    /**
     * @Scheduled注解
     * @Scheduled(fixedRate = 5000) ：上一次执行开始时间点之后5秒再执行
     * @Scheduled(fixedDelay = 5000) ：上一次执行完毕时间点之后5秒再执行
     * @Scheduled(initialDelay=1000, fixedRate=5000) ：第一次延迟1秒后执行，之后按fixedRate的规则每5秒执行一次。initialDelay表示第一次调用前的延时，单位毫秒，必需配合cron、fixedDelay或者fixedRate来使用。
     * @Scheduled(cron="*5*****") ：通过cron表达式定义规则，与fixedDelay类似，上次执行完毕后才进行下次调度。
     */
    /**
     * 多任务定时器
     * 分析：
     * 若两个任务串行，则task01每3秒打印一次，而task02会受到task01影响每3秒打印一次
     * 若两个任务并行，则task01每3秒打印一次，而task02则不受影响每2秒打印一次
     *
     * @throws InterruptedException
     */
//    @Scheduled(fixedDelay = 1000)
//    public void task01() throws InterruptedException {
//        System.out.println(Thread.currentThread().getName() + " | task01 " + new Date().toLocaleString());
//        Thread.sleep(2000);
//    }
//
//    @Scheduled(fixedDelay = 2000)
//    public void task02() {
//        System.out.println(Thread.currentThread().getName() + " | task02 " + new Date().toLocaleString());
//    }

    /**
     * 执行两个方法得出结论
     * 多个定时任务是串行执行的；
     * 如果一个任务出现阻塞，其他的任务都会受到影响。
     * 而且从图中打印的线程名称也可以看出2个任务都是由同一个线程"pool-1-thread-1"调度的。
     */
}
